//package com.qipay.core.http;
//
//import com.fasterxml.jackson.core.JsonProcessingException;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.http.Header;
//import org.apache.http.HttpEntity;
//import org.apache.http.HttpResponse;
//import org.apache.http.client.methods.*;
//import org.apache.http.client.utils.URLEncodedUtils;
//import org.apache.http.entity.StringEntity;
//import org.apache.http.message.BasicNameValuePair;
//import org.apache.http.util.EntityUtils;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//import org.springframework.util.Assert;
//
//import java.io.IOException;
//import java.io.InputStream;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//
//@Component
//public class HttpRequestExecutor {
//
//    final Logger logger = LoggerFactory.getLogger(getClass());
//
//    @Autowired
//    protected ObjectMapper mapper;
//
//
//
//    public <T> T getForObject(String url, Class<T> responseClass) {
//        HttpGet httpGet = new HttpGet(url);
//        return execute(httpGet, responseClass);
//    }
//
//    public <T> T getForObject(String url, Class<T> responseClass, Header... headers) {
//        HttpGet httpGet = new HttpGet(url);
//        for (Header header : headers) {
//            httpGet.addHeader(header);
//        }
//        return execute(httpGet, responseClass);
//    }
//
//    public <T> T getForObject(String url, Map<String, String> urlVariables, Class<T> responseClass) {
//        String requestUrl = constructUrl(url, urlVariables);
//        HttpGet httpGet = new HttpGet(requestUrl);
//        return execute(httpGet, responseClass);
//    }
//
//    public String getForString(String url, Map<String, String> urlVariables) {
//        String requestUrl = constructUrl(url, urlVariables);
//        HttpGet httpGet = new HttpGet(requestUrl);
//        return executeAsString(httpGet);
//    }
//
//    public SimpleHttpResponse getForResponse(String url, Header... headers) {
//        HttpGet httpGet = new HttpGet(url);
//        for (Header header : headers) {
//            httpGet.addHeader(header);
//        }
//        return execute(httpGet);
//    }
//
//    public SimpleHttpResponseAsInputStream getForResponseAsInputStream(String url, Header... headers) {
//        HttpGet httpGet = new HttpGet(url);
//        for (Header header : headers) {
//            httpGet.addHeader(header);
//        }
//        return executeAsInputStream(httpGet);
//    }
//
//    public String getForString(String url, Header... headers) {
//        HttpGet httpGet = new HttpGet(url);
//        for (Header header : headers) {
//            httpGet.addHeader(header);
//        }
//        return executeAsString(httpGet);
//    }
//
//    public String deleteForString(String url, Header... headers) {
//        HttpDelete httpDelete = new HttpDelete(url);
//        for (Header header : headers) {
//            httpDelete.addHeader(header);
//        }
//        return executeAsString(httpDelete);
//    }
//
//    public SimpleHttpResponse deleteForResponse(String url, Header... headers) {
//        HttpDelete httpDelete = new HttpDelete(url);
//        for (Header header : headers) {
//            httpDelete.addHeader(header);
//        }
//        return execute(httpDelete);
//    }
//
//    public <T> T deleteForObject(String url, Class<T> responseClass, Header... headers) {
//        HttpDelete delete = new HttpDelete(url);
//        for (Header header : headers) {
//            delete.addHeader(header);
//        }
//        return execute(delete, responseClass);
//    }
//
//    public <T, U> T postForObject(String url, U requestEntity, Class<T> responseClass) {
//        return postForObject(url, requestEntity, responseClass, "application/json");
//    }
//
//    public <T, U> T postForObject(String url, U requestEntity, Class<T> responseClass, String accept) {
//        HttpPost httpPost = new HttpPost(url);
//        httpPost.addHeader("content-type", "application/json");
//        httpPost.addHeader("accept", accept);
//        StringEntity entity = null;
//        if (requestEntity != null) {
//            try {
//                entity = new StringEntity(mapper.writeValueAsString(requestEntity), "UTF-8");
//            } catch (JsonProcessingException e) {
//                logger.error(e.getMessage());
//                e.printStackTrace();
//            }
//            httpPost.setEntity(entity);
//        }
//        return execute(httpPost, responseClass);
//    }
//
//    public <T, U> T postForObject(String url, U requestEntity, Class<T> responseClass, Header... headers) {
//        HttpPost httpPost = new HttpPost(url);
//        httpPost.addHeader("content-type", "application/json");
//        for (Header header : headers) {
//            httpPost.addHeader(header);
//        }
//        if (requestEntity != null) {
//            StringEntity entity = null;
//            try {
//                entity = new StringEntity(mapper.writeValueAsString(requestEntity), "UTF-8");
//            } catch (JsonProcessingException e) {
//                logger.error(e.getMessage());
//                e.printStackTrace();
//            }
//            httpPost.setEntity(entity);
//        }
//        return execute(httpPost, responseClass);
//    }
//
//    public <U> String postForObjectAsString(String url, U requestEntity, Header... headers) {
//        HttpPost httpPost = new HttpPost(url);
//        httpPost.addHeader("content-type", "application/json");
//        for (Header header : headers) {
//            httpPost.addHeader(header);
//        }
//        StringEntity entity = null;
//        try {
//            entity = new StringEntity(mapper.writeValueAsString(requestEntity), "UTF-8");
//        } catch (JsonProcessingException e) {
//            logger.error(e.getMessage());
//            e.printStackTrace();
//        }
//        httpPost.setEntity(entity);
//        return executeAsString(httpPost);
//    }
//
//    public String postForString(String url, String requestString, Header... headers) {
//        HttpPost httpPost = new HttpPost(url);
//        for (Header header : headers) {
//            httpPost.addHeader(header);
//        }
//        StringEntity entity = null;
//        entity = new StringEntity(requestString, "UTF-8");
//        httpPost.setEntity(entity);
//        return executeAsString(httpPost);
//    }
//
//    public SimpleHttpResponse postForResponse(String url, String requestString, Header... headers) {
//        HttpPost httpPost = new HttpPost(url);
//        for (Header header : headers) {
//            httpPost.addHeader(header);
//        }
//        StringEntity entity = null;
//        entity = new StringEntity(requestString, "UTF-8");
//        httpPost.setEntity(entity);
//        return execute(httpPost);
//    }
//
//    public String putForString(String url, String requestString, Header... headers) {
//        HttpPut httpPut = new HttpPut(url);
//        for (Header header : headers) {
//            httpPut.addHeader(header);
//        }
//        StringEntity entity = null;
//        entity = new StringEntity(requestString, "UTF-8");
//        httpPut.setEntity(entity);
//        return executeAsString(httpPut);
//    }
//
//    public SimpleHttpResponse putForResponse(String url, String requestString, Header... headers) {
//        HttpPut httpPut = new HttpPut(url);
//        for (Header header : headers) {
//            httpPut.addHeader(header);
//        }
//        StringEntity entity = null;
//        entity = new StringEntity(requestString, "UTF-8");
//        httpPut.setEntity(entity);
//        return execute(httpPut);
//    }
//
//    protected <T> T execute(HttpRequestBase request, Class<T> responseClass) {
//        if (logger.isDebugEnabled()) {
//            logRequest(request);
//        }
//        try {
//            HttpResponse response = apacheHttpClient.create().execute(request);
//            validateHttpStatusCode(response);
//            HttpEntity entity = response.getEntity();
//            String responseText = (entity == null) ? null : EntityUtils.toString(response.getEntity(), "UTF-8");
//            if (StringUtils.isEmpty(responseText)) {
//                return null;
//            }
//            logger.info("receive entity: '{}'", responseText);
//            return mapper.readValue(responseText, responseClass);
//        } catch (IOException e) {
//            logger.error(e.getMessage());
//            e.printStackTrace();
//        }
//        return null;
//    }
//
//    protected SimpleHttpResponse execute(HttpRequestBase request) {
//        if (logger.isDebugEnabled()) {
//            logRequest(request);
//        }
//        try {
//            HttpResponse response = apacheHttpClient.create().execute(request);
//            validateHttpStatusCode(response);
//            HttpEntity entity = response.getEntity();
//            String responseText = (entity == null) ? null : EntityUtils.toString(response.getEntity(), "UTF-8");
//            SimpleHttpResponse simpleResponse = new SimpleHttpResponse();
//            simpleResponse.setHeaders(response.getAllHeaders());
//            simpleResponse.setStatusCode(response.getStatusLine().getStatusCode());
//            simpleResponse.setReponseBody(responseText);
//            return simpleResponse;
//        } catch (IOException e) {
//            logger.error(e.getMessage());
//            e.printStackTrace();
//        }
//        return null;
//    }
//
//    protected SimpleHttpResponseAsInputStream executeAsInputStream(HttpRequestBase request) {
//        if (logger.isDebugEnabled()) {
//            logRequest(request);
//        }
//        try {
//            HttpResponse response = apacheHttpClient.create().execute(request);
//            validateHttpStatusCode(response);
//            HttpEntity entity = response.getEntity();
//            SimpleHttpResponseAsInputStream simpleResponse = new SimpleHttpResponseAsInputStream();
//            simpleResponse.setHeaders(response.getAllHeaders());
//            simpleResponse.setStatusCode(response.getStatusLine().getStatusCode());
//            simpleResponse.setInputStream(entity.getContent());
//            return simpleResponse;
//        } catch (IOException e) {
//            logger.error(e.getMessage());
//            e.printStackTrace();
//        }
//        return null;
//    }
//
//    protected String executeAsString(HttpRequestBase request) {
//        if (logger.isDebugEnabled()) {
//            logRequest(request);
//        }
//        try {
//            HttpResponse response = apacheHttpClient.create().execute(request);
//            validateHttpStatusCode(response);
//            HttpEntity entity = response.getEntity();
//            String responseText = (entity == null) ? null : EntityUtils.toString(response.getEntity(), "UTF-8");
//            if (StringUtils.isEmpty(responseText)) {
//                return null;
//            }
//            return responseText;
//        } catch (IOException e) {
//            logger.error(e.getMessage());
//            e.printStackTrace();
//        }
//        return null;
//    }
//
//    public String constructUrl(String url, Map<String, String> urlVariables) {
//        String requestUrl = url.endsWith("?") ? url : url + "?";
//        List<BasicNameValuePair> params = new ArrayList<>();
//        for (Map.Entry<String, String> entry : urlVariables.entrySet()) {
//            BasicNameValuePair basicNameValuePair = new BasicNameValuePair(entry.getKey(), entry.getValue().toString());
//            params.add(basicNameValuePair);
//        }
//        String paramString = URLEncodedUtils.format(params, "utf-8");
//        return requestUrl + paramString;
//    }
//
//    protected void validateHttpStatusCode(HttpResponse httpResponse) throws IOException {
//        if (httpResponse.getStatusLine().getStatusCode() >= 400) {
//            int statusCode = httpResponse.getStatusLine().getStatusCode();
//            logger.error("invalidate http status, statusCode={}", statusCode);
//        }
//    }
//
//    protected void logRequest(HttpRequestBase request) {
//        Assert.notNull(request, "method param [request] cannot be null.");
//        logger.debug("send http request, method={}, uri={}", request.getMethod(), request.getURI());
//        if (request instanceof HttpPost) {
//            String content = StringUtils.EMPTY;
//            try {
//                HttpEntity entity = ((HttpPost) request).getEntity();
//                if (entity != null) {
//                    content = EntityUtils.toString(entity, "UTF-8");
//                }
//            } catch (IOException e) {
//                logger.error("IOException when read content of post content.", e);
//            }
//            logger.debug("request content={}", content);
//        }
//    }
//
//    public static class SimpleHttpResponse {
//
//        private Header[] headers;
//
//        private int statusCode;
//
//        private String reponseBody;
//
//        public Header[] getHeaders() {
//            return headers;
//        }
//
//        public void setHeaders(Header[] headers) {
//            this.headers = headers;
//        }
//
//        public int getStatusCode() {
//            return statusCode;
//        }
//
//        public void setStatusCode(int statusCode) {
//            this.statusCode = statusCode;
//        }
//
//        public String getReponseBody() {
//            return reponseBody;
//        }
//
//        public void setReponseBody(String reponseBody) {
//            this.reponseBody = reponseBody;
//        }
//    }
//
//    public static class SimpleHttpResponseAsInputStream {
//
//        private Header[] headers;
//
//        private int statusCode;
//
//        private InputStream inputStream;
//
//        public Header[] getHeaders() {
//            return headers;
//        }
//
//        public void setHeaders(Header[] headers) {
//            this.headers = headers;
//        }
//
//        public int getStatusCode() {
//            return statusCode;
//        }
//
//        public void setStatusCode(int statusCode) {
//            this.statusCode = statusCode;
//        }
//
//        public InputStream getInputStream() {
//            return inputStream;
//        }
//
//        public void setInputStream(InputStream inputStream) {
//            this.inputStream = inputStream;
//        }
//
//    }
//}
